#!/usr/bin/python3
#coding=utf-8
import dpkt
import collections  #有序字典需要的模块
import time
import socket
file_path='/home/shen/carMove_2.pcap'
burger_dst='192.168.1.102'
pkt_len=52
def main():
	f = open(file_path,'rb')
	#先按.pcap格式解析，若解析不了，则按pcapng格式解析
	try:
	   pcap = dpkt.pcap.Reader(f) 
	except:
	   pcap = dpkt.pcapng.Reader(f) #解析pcapng会失败，建议使用scapy库的rdpcap去解析
	   
	#当前变量pcap中是按照“间戳：单包”的格式存储着各个单包
	#将时间戳和包数据分开，一层一层解析，其中ts是时间戳，buf存放对应的包
	for (ts,buf) in pcap:
		try:
			eth = dpkt.ethernet.Ethernet(buf) #解包，物理层
			if not isinstance(eth.data, dpkt.ip.IP): #解包，网络层，判断网络层是否存在，如果不存在则丢弃
				continue
			ip = eth.data
			#将网络地址转换成“.”点隔的字符串格式
			src = socket.inet_ntoa(ip.src)
			dst = socket.inet_ntoa(ip.dst)
			#解包，判断目的地址是否是小车地址burger_dst，传输层协议是否是TCP,如果不是则丢弃
			if not (dst==burger_dst and isinstance(ip.data, dpkt.tcp.TCP)):
				continue
			tcp = ip.data #传输层负载数据，基本上分析流量的人都是分析这部分数据，即应用层负载流量
			#如果应用层负载长度为0，即该包为单纯的tcp包，没有负载，则丢弃
			if not len(tcp.data)==pkt_len: 
				continue
			#验证结果，打印保存的数据包的抓包以及对应的包的应用层负载长度
			print("Length:%d"%len(tcp.data)) #将时间戳转换成日期
			print("Data:%s"%tcp.data)#打印传输层负载数据,因为小车数据传输过程中没有加密，所以可以直接打印
		except Exception as err:
			print("[error] %s" % err)
	f.close()
main()

